Technical Q&A QA1197
Mapping kernel memory to user space on Mac OS X 10.2


Q: I/O Kit ÉJÅ[ÉlÉãÉhÉâÉCÉoÇ≈ÉÅÉÇÉäÇäÑÇËìñǃÇΩå„ÅAǪÇÍÇ IOMemoryDescriptor::map ÇégǡǃÉÜÅ[ÉUãÛä‘Ç…É}ÉbÉvǵǃǢNjÇ∑ÅBMac OS X ÇÃà»ëOÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕDZÇÃèàóùǙǧNjÇ≠çsǡǃǢÇΩÇÃÇ≈Ç∑Ç™ÅA10.2 Ç≈ÇÕ map Ç™ NULL ÇñflÇ∑ÇÊǧDžǻÇËNjǵÇΩÅBÇ«ÇÃÇÊǧǻïœçXǙdžÇËÅAâåàÇ∑ÇÈÇÃÇ©Çã≥ǶǃÇ≠ÇæÇ≥Ç¢ÅB

A: IOMemoryDescriptor::map ÇÕóvãÅÇ≥ÇÍÇΩÇΔÇ®ÇËÇ…ÉoÉbÉtÉ@ÇÉ}ÉbÉvÇ≈ǴǻǢÇΔ NULL ÇñflǵNjÇ∑ÅB

à»â∫Ç…ÅAMac OS X 10.2 Ç≈DZÇÍÇ™ïœçXÇ≥ÇÍÇΩîwåiÇê‡ñæÇµÇ‹Ç∑ÅBI/O Kit ÇÕÅAǪÇà malloc ópÇÃè¨Ç≥Ç»ÉäÉ\Å[ÉXÇΔǵǃÅAÉJÅ[ÉlÉã zalloc ÉvÅ[ÉãÇégǢNjÇ∑ÅBDZÇÍÇ…ÇÊÇËÅAÉhÉâÉCÉoçÏê¨é“ÇÕÅAÉçÅ[ÉJÉãÇ≈égópÇ∑ÇÈÉÅÉÇÉäÇÇ∑njǂÇ≠äÑÇËìñǃÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÅAnew ââéZéqÇΔÅAë∂ë±ä˙ä‘Ç™ã…í[Ç…íZÇ¢ÉoÉbÉtÉ@Ç…ÇΔǡǃÇÕîÒèÌÇ…èdóvÇ≈Ç∑ÅBñ‚ëËÇÕÅAÉhÉâÉCÉoçÏê¨é“Ç™ÅAÉ]Å[ÉìÉAÉçÉPÅ[É^ÇÃópìrÇÕàÍéûìIÇ≈Ç≤Ç≠ÉvÉâÉCÉxÅ[ÉgÇ»äÑÇËìñǃópÇ≈džÇÈDZÇΔÇñYÇÍǃÅAÉÅÉÇÉäÇÉÜÅ[ÉUãÛä‘ÇΔã§óLǵÇÊǧÇΔǵÇΩÇΔÇ´Ç…ãNDZÇËÇ‹Ç∑ÅB

ó†ë§Ç≈ÇÕÅAIOMallocÅAIOMallocAlignedÅAIOMallocContiguous ǻǫÇà I/O Kit ÉAÉçÉPÅ[É^ÇÕÅADZÇÃÉ]Å[ÉìÉAÉçÉPÅ[É^ÇégópǵǃÅAégópïpìxÇ™çÇÇ≠è¨Ç≥Ç»ÉÅÉÇÉäÇÃäÑÇËìñǃèàóùÇÃå¯ó¶Çå¸è„Ç≥ÇπǃǢNjÇ∑ÅBǵǩǵÅAIOMallocAligned Ç‹ÇΩÇÕ IOMallocContiguous ÇégópǵǃÅAè≠Ç»Ç≠ÇΔLJ 1 ǬÇÃäÆëSÇ»ÉyÅ[ÉWÇóvãÅǵÇΩèÍçáÅADZÇÍÇÁÇÃÉCÉìÉ^ÉtÉFÅ[ÉXÇÕÇ«ÇøÇÁLJã§óLâ¬î\Ç»ÉoÉbÉtÉ@ÇñflǵNjÇ∑ÅBÉyÅ[ÉWÇÃÉTÉCÉYÇÕÉnÅ[ÉhÉRÅ[ÉhǵǃÇÕÇ»ÇËÇ‹ÇπÇÒÅBë„ÇÌÇËÇ…ÅAÉJÅ[ÉlÉãÇÃÉOÉçÅ[ÉoÉãïœêî page_size ÇégópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBç≈èIìIÇ…ã§óLÇ∑ÇÈǬLJÇËÇÃÉÅÉÇÉäÇéÊìæÇ∑ÇÈèÍçáÅAIOMalloc ÇÕégópǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅB

ǪÇÍÇÊÇËLJÇÊÇ¢ÇÃÇÕÅAIOBufferMemoryDescriptor ÇégópǵǃÅAÉoÉbÉtÉ@ÇΔÉÅÉÇÉäãLèqéqÇàÍèèÇ…äÑÇËìñǃÇÈÇΔǢǧï˚ñ@Ç≈Ç∑ÅBDZÇÃä÷êîÇÕÅAÉäÉXÉg 1 Ç…é¶Ç∑ÇÊǧDžÅAÉoÉbÉtÉ@ÇÃäÑÇËìñǃÇèàóùǵNjÇ∑ÅB


 memDesc = IOBufferMemoryDescriptor::withOptions(
              kIODirectionOutIn | kIOMemoryKernelUserShared,
              alloc_bytes, page_size );

ÉäÉXÉg 1Å@IOBufferMemoryDescriptor ÇÃégóp


êÑèßÇ≥ÇÍǃǢÇÈDZÇÍÇÁÇÃéËñ@ÇÃÇ«ÇÍÇ©ÇégǡǃÉoÉbÉtÉ@ÇäÑÇËìñǃÇÍÇŒÅAIOMemoryDescriptor::map ÇégópǵǃǪÇÃÉoÉbÉtÉ@ÇÉÜÅ[ÉUãÛä‘ÇΔã§óLÇ≈Ç´ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅB


[2002 îN 9 åé 13 ì˙]